/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.camachosanchez.reportes;

import com.camachosanchez.bean.ControlCambioNeumatico;
import com.camachosanchez.bean.DetalleControlCambioNeumatico;
import com.camachosanchez.bean.Vehiculos;
import com.camachosanchez.util.JPAUtil;
import com.camachosanchez.util.ReportUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Desktop;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.swing.JOptionPane;
/**
 *
 * @author Zully
 */
public class ReporteMontajes {
    private EntityManagerFactory emf;
    private EntityManager em;
    
    public ReporteMontajes() {
        emf = JPAUtil.getEntityManagerFactory();
        em = emf.createEntityManager();
    }
    
    public void generarReporte(Vehiculos vehiculo) {
        Document document = new Document(PageSize.A4, 0, 0, 50, 50);
        try {
            String nombrePdf = "reportes/montajes_" + vehiculo.getPlaca() + ".pdf";
            PdfWriter.getInstance(document, new FileOutputStream(nombrePdf));
            document.open();
            document.addTitle("Montajes: " + vehiculo.getPlaca());
            
            float[] anchoColsCab = {1.1f, 0.6f};//version prueba
            PdfPTable tablaC=new PdfPTable(anchoColsCab);
            tablaC.setSpacingAfter(20f);
            tablaC.setHorizontalAlignment(Element.ALIGN_CENTER);
            tablaC.setWidthPercentage(90);

            PdfPCell celda =new PdfPCell (new Paragraph("Montajes y Desmontajes en " + vehiculo.getPlaca(),
            FontFactory.getFont(BaseFont.HELVETICA,16,Font.BOLD,BaseColor.BLACK)));
            celda.setHorizontalAlignment(Element.ALIGN_CENTER);
            celda.setBorderWidth(0);
            tablaC.addCell(celda);

            tablaC.addCell(ReportUtil.getCelda("TireSoft 2.0 (Versión de prueba)",1,1,BaseColor.WHITE,0,0,10,1));//version prueba
            document.add(tablaC);
            float[] anchoColsR = {0.25f, 0.08f, 0.3f, 0.25f, 0.3f, 0.3f, 0.6f, 0.07f};
            PdfPTable tablaMontajes=new PdfPTable(anchoColsR);
            tablaMontajes.setWidthPercentage(80);
            tablaMontajes.setSpacingBefore(5f);
            
            List<ControlCambioNeumatico> datos = this.getDatos(vehiculo.getId());
            if(datos != null) {
                SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd-MM-yyyy");
                String valorC;
                int nroControl = 1;
                for(ControlCambioNeumatico control : datos) {
                    List<DetalleControlCambioNeumatico> detalle = control.getDetalleControlCambioNeumaticoList();
                    ordernarListaPorPosicion(detalle, "posicion");
                    String fecha = "";
                    String kilometraje = "";
                    String taller = "";
                    if(control.getFecha() != null)
                        fecha = formatoDeFecha.format(control.getFecha());
                    if(control.getKilometraie() != null)
                        kilometraje = control.getKilometraie() + "";
                    if(control.getIdTaller() != null)
                        taller = control.getIdTaller().getNombre();
                    tablaMontajes.addCell(ReportUtil.getCelda((nroControl++) + ". Fecha: " + fecha + "      Kilometraje: " + kilometraje + "      Taller: " + taller,8,1,new BaseColor(192,209,255),0,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("Tipo",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("P",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("Código",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("Serie",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("Marca",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("Modelo",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("Distribuidor",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    tablaMontajes.addCell(ReportUtil.getCelda("R",1,1,new BaseColor(217,227,255),1,0.5f,9,1));
                    for(DetalleControlCambioNeumatico item: detalle) {
                        switch(item.getTipo()) {
                            case -1: valorC = "Desmontaje";
                                break;
                            case 1: valorC = "Montaje";
                                break;
                            default: valorC="";
                                break;
                        }
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,new BaseColor(217,227,255),0,0.5f,9,0));
                        valorC = (item.getPosicion() <= 0)? "®" : item.getPosicion() + "";
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,new BaseColor(217,227,255),0,0.5f,9,0));
                        valorC = (item.getIdNeumatico()==null)? "" : item.getIdNeumatico().getCodigo();
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,BaseColor.WHITE,0,0.5f,9,0));
                        valorC = (item.getIdNeumatico().getNumSerie()==null)? "" : item.getIdNeumatico().getNumSerie();
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,BaseColor.WHITE,0,0.5f,9,0));
                        valorC = (item.getIdNeumatico().getIdMarca()==null)? "" : item.getIdNeumatico().getIdMarca().getNombre();
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,BaseColor.WHITE,0,0.5f,9,0));
                        valorC = (item.getIdNeumatico().getIdModelo()==null)? "" : item.getIdNeumatico().getIdModelo().getMedida();
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,BaseColor.WHITE,0,0.5f,9,0));
                        valorC = (item.getIdNeumatico().getIdDistribuidor()==null)? "" : item.getIdNeumatico().getIdDistribuidor().getNombre();
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,BaseColor.WHITE,0,0.5f,9,0));
                        valorC = item.getIdNeumatico().getNumRenovaciones() + "";
                        tablaMontajes.addCell(ReportUtil.getCelda(valorC,1,1,BaseColor.WHITE,0,0.5f,9,0));
                    }
                }
            }
            document.add(tablaMontajes);
            document.close();
//            Runtime.getRuntime().exec ("cmd.exe /c start " + nombrePdf);
            File pdfFile = new File(nombrePdf);
            if (Desktop.isDesktopSupported()) {
                Desktop.getDesktop().open(pdfFile);
            } else {
                JOptionPane.showMessageDialog(null, "No se puede abrir el reporte.", "Error al abrir el archivo", JOptionPane.ERROR_MESSAGE);
            }
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }
    
    private List<ControlCambioNeumatico> getDatos(int idVehiculo) {
        Query q1 = em.createQuery("SELECT C FROM ControlCambioNeumatico C "
                                + "WHERE C.idVehiculo.id = :idVehiculo "
                                + "ORDER BY C.fecha, C.id");
        q1.setParameter("idVehiculo", idVehiculo);
        return q1.getResultList();
    }
    
    private void ordernarListaPorPosicion(List lista, final String propiedad) {
        Collections.sort(lista, new Comparator() {

            @Override
            public int compare(Object o1, Object o2) {
                Class clase = o1.getClass();
                String getter = "get" + Character.toUpperCase(propiedad.charAt(0)) + propiedad.substring(1);
                try {
                    Method getPropiedad = clase.getMethod(getter);
                    Object propiedad1 = getPropiedad.invoke(o1);
                    Object propiedad2 = getPropiedad.invoke(o2);
                    if (propiedad1 instanceof Comparable && propiedad2 instanceof Comparable) {
                        Comparable prop1 = (Comparable) propiedad1;
                        Comparable prop2 = (Comparable) propiedad2;
                        return prop1.compareTo(prop2);
                    } else {
                        if (propiedad1.equals(propiedad2)) {
                            return 0;
                        } else {
                            return 1;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return 0;
            }
        });
    }
}
